/*
 * @Author       : Zhao Lvhua zhaolh@linkcharging.com
 * @Date         : 2024-08-02 14:47:02
 * @LastEditors  : Bing Chen chenbing@iocharger.com
 * @LastEditTime : 2025-03-15 13:13:15
 * @FilePath     : \openchaoji-corelib\shared\src\OpenChaoJi_utility_transport_gbt27930_a.h
 * @Description  : GBT27930 A类系统传输层具体实现，包括需要确认长消息、需要确认短消息、不需要确认的短消息的发送，接收处理
 *
 * Copyright (c) 2025 OpenChaoJi
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the icense for the specific language governing permissions and
 * limitations under the License.
 *
 */


#ifndef OPENCHAOJI_TRANSPORT_SYSTEM_A__H
#define OPENCHAOJI_TRANSPORT_SYSTEM_A__H

#include "../include/OpenChaoJi_shared.h"

#if (OPENCHAOJI_CONFIG_ENABLE_GBT27930_A == CONFIG_YES)

struct OpenChaoJi_gbt27930_a_rmcb;

/*
* @brief: A类系统对于可靠消息状态处理方法，对于可靠长消息、可靠短消息的接收发送状态机的处理，一般建议不超过5ms调用一次
* @param {OpenChaoJi_gbt27930_a_rmcb *} rmcb 可靠确认消息体的指针
* @return 成功返回0，失败返回-1。
*/
int16_t OpenChaoJi_utility_transport_gbt27930_a_service(struct OpenChaoJi_gbt27930_a_rmcb * rmcb);



/*
* @brief: 获取A类系统CAN底层数据帧类型，根据数据帧类型输入到对应的消息控制块中
* @param {can_pdu *} pdu 可靠确认消息体的指针
* @return 不可靠消息返回0，可靠消息返回1。
*/
int16_t OpenChaoJi_transport_gbt27930_a_get_canframe_type(struct can_pdu * pdu);


/*
* @brief: 创建A类系统不需要确认消息实体
* @return 成功返回创建消息的指针，失败返回NULL。
*/
struct OpenChaoJi_gbt27930_a_urmcb * OpenChaoJi_transport_gbt27930_a_urm_new(void * param);

/*
* @brief: 释放不需要确认消息实体
* @param {OpenChaoJi_gbt27930_a_urmcb *} urmcb 不需要确认消息体的指针
* @return 成功返回0，失败返回-1。
*/
int16_t OpenChaoJi_transport_gbt27930_a_urm_free(struct OpenChaoJi_gbt27930_a_urmcb * urmcb);

/*
* @brief:初始化不需要确认消息实体，主要对消息内部参数进行初始化
* @param {OpenChaoJi_gbt27930_a_urmcb *} urmcb 不需要确认消息体的指针
* @return 成功返回0，失败返回-1。
*/
int16_t OpenChaoJi_transport_gbt27930_a_urm_init(struct OpenChaoJi_gbt27930_a_urmcb * urmcb);

/*
* @brief: 不需要确认消息体收发源地址，目的地址，底层CAN接收函数，发送函数绑定
* @param {OpenChaoJi_gbt27930_a_urmcb *} urmcb 不需要确认消息体的指针
* @param src_addr CAN节点源地址
* @param dest_addr CAN节点目的地址
* @param can_send_func CAN数据帧发送函数
* @param can_recv_func CAN数据帧接收函数
* @return 成功返回0，失败返回-1。
*/
int16_t OpenChaoJi_transport_gbt27930_a_urm_bind(struct OpenChaoJi_gbt27930_a_urmcb * urmcb, int tag, uint8_t src_addr, uint8_t dest_addr,
												int (* can_send_func)(void * param, const struct can_pdu * send_pdu),
												int (* can_recv_func)(void * param, struct can_pdu * recv_pdu));


/*
* @brief: 获取不可靠消息体的消息，如果有消息，则把消息存放到接收数据参数recv_data里面
* @param {OpenChaoJi_gbt27930_a_urmcb  *} urmcb 不可靠消息的消息体指针
* @param {can_data *} recv_data 用来存储消息数据体
* @return 有新消息返回0，没有新消息返回-1。
*/
int16_t OpenChaoJi_utility_transport_gbt27930_a_got_urm_msg(struct OpenChaoJi_gbt27930_a_urmcb  * urmcb, struct can_data * recv_data);


/*
* @brief: 创建A类系统需要确认消息实体
* @return 成功返回创建消息的指针，失败返回NULL。
*/
struct OpenChaoJi_gbt27930_a_rmcb * OpenChaoJi_transport_gbt27930_a_rm_new(void * param);

/*
* @brief: 释放需要确认消息实体
* @param {OpenChaoJi_gbt27930_a_rmcb *} rmcb 可靠消息体的指针
* @return 释放成功返回0，失败返回-1。
*/
int16_t OpenChaoJi_transport_gbt27930_a_rm_free(struct OpenChaoJi_gbt27930_a_rmcb * rmcb);

/*
* @brief:初始化可靠消息实体，主要对消息内部参数进行初始化
* @param {OpenChaoJi_gbt27930_a_rmcb *} rmcb 可靠消息体的指针
* @return 成功返回0，失败返回-1。
*/
int16_t OpenChaoJi_transport_gbt27930_a_rm_init(struct OpenChaoJi_gbt27930_a_rmcb * rmcb);

/*
* @brief: 可靠消息体收发源地址，目的地址，底层CAN接收函数，发送函数绑定
* @param {OpenChaoJi_gbt27930_b_rmcb *} rmcb 不需要确认消息体的指针
* @param src_addr CAN节点源地址
* @param dest_addr CAN节点目的地址
* @param can_send_func CAN数据帧发送函数
* @param can_recv_func CAN数据帧接收函数
* @return 成功返回0，失败返回-1。
*/
int16_t OpenChaoJi_transport_gbt27930_a_rm_bind(struct OpenChaoJi_gbt27930_a_rmcb * rmcb, int tag, uint8_t src_addr, uint8_t dest_addr,\
																int (* can_send_func)(void * param, const struct can_pdu * send_pdu),\
																int (* can_recv_func)(void * param, struct can_pdu * recv_pdu));

/*
* @brief: 获取可靠消息体的消息，如果有消息，则把消息存放到接收数据参数recv_data里面
* @param {OpenChaoJi_gbt27930_a_rmcb  *} rmcb 可靠消息的消息体指针，包含必要的环境信息。
* @param {can_data *} recv_data 用来存储消息数据体
* @return 有新消息返回0，没有新消息返回-1。
*/
int16_t OpenChaoJi_utility_transport_gbt27930_a_got_rm_msg(struct OpenChaoJi_gbt27930_a_rmcb  * rmcb, struct can_data * recv_data);

/*
* @brief: gbt27930 B类系统不需要确认的短消息发送函数
* @param {OpenChaoJi_gbt27930_a_urmcb *} urmcb 不可靠消息的消息体指针，包含必要的环境信息。
* @param {can_data *} send_data 待发送数据
* @return: 成功返回0，失败返回-1。
*/
int16_t OpenChaoJi_transport_gbt27930_a_ursm_send(struct OpenChaoJi_gbt27930_a_urmcb * urmcb, const struct can_data * send_data);

/*
* @brief: gbt27930 B类系统不需要确认短消息的接收处理
* @param {can_pdu *} pdu 接收到数据帧
* @param {OpenChaoJi_gbt27930_a_urmcb *} urmcb 不可靠消息的消息体指针，包含必要的环境信息。
* @return {*} 成功返回0，失败返回-1。
*/
int16_t OpenChaoJi_transport_gbt27930_a_urm_input(struct can_pdu * pdu,  struct OpenChaoJi_gbt27930_a_urmcb * urmcb);

/*
* @brief: gbt27930 B类系统需要确认的短消息发送接口函数，该函数内部根据发送字节数区分长消息或短消息，进行缓存，然后执行发送
* @param {OpenChaoJi_gbt27930_a_rmcb *} rmcb 可靠消息的消息体指针，包含必要的环境信息。
* @param {can_data *} send_data 待发送数据
* @return {*}成功返回0，失败返回-1。
*/
int16_t OpenChaoJi_transport_gbt27930_a_rm_write(struct OpenChaoJi_gbt27930_a_rmcb * rmcb, const struct can_data * send_data);

/*
* @brief: 对gbt27930 B类系统接收数据帧进行类型解析，分发处理
* @param {can_pdu *} pdu 接收到数据帧
* @param {OpenChaoJi_gbt27930_a_rmcb *} rmcb 可靠消息的消息体指针，包含必要的环境信息。
* @return {*}成功返回0，失败返回-1。
*/
int16_t OpenChaoJi_transport_gbt27930_a_rm_input(struct can_pdu * pdu, struct OpenChaoJi_gbt27930_a_rmcb * rmcb);

#endif

#endif // OPENCHAOJI_TRANSPORT_SYSTEM_B__H.
